package com.bw.lib_net.test_okhttp

import okhttp3.Call
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import java.io.IOException

/**
 * @author ytx
 * @date 2025-09-17 08:21
 * @description
okhttp：网络请求库，底层使用socket发起网络请求
Okhttp源码解析
1.创建OkhttpClient.Builder():里面初始化一些重要属性
    dispatcher调度器：三个任务队列(正在运行的同步任务队列/正在运行异步任务队列/准备执行异步任务队列)+线程池
    connectionPool：连接池，网络连接可以进行复用，最多5个，每个链接最终保持5分钟
    connectTimeOut/readTimeOut/writeTimeOut：默认十秒

2.创建request对象：url网址/请求方式默认是get/请求头/请求体/tag
3.client发起request得到RealCall
4.同步和异步：
同步：execute()方法：调用dispatcher调度器将RealCall放在正在运行的同步任务队列中
异步：enqueue()方法：调用dispatcher调度器判断正在执行的异步任务队列是否超过最大request数量64，若超过将Call放在准备异步任务队列，若没超过将Call放在正在异步任务队列中并交给线程池执行该任务(线程池的核心线程数为0，最大线程数默认为Integer.MAX_VALUE无上限,阻塞队列无界队列 ，等价于缓冲线程池)

5.无论是同步还是异步都会执行getResponseWithInterceptorChain()获得最终的response结果
（1）里面7种拦截器：自定义Inteceptor—》重连和重定向拦截器—〉桥拦截器(gZip)—>缓存拦截器—>链接拦截器->自定义NetWorkInteceptor-》CallServerInteceptor真正发送数据和读取数据
（2）将7种拦截封装在责任链中，最后执行得到response结果

 */
class TestOkHttp {

    fun test(){
        // 1.创建OkHttpClient对象
        val okHttpClient = OkHttpClient.Builder()
//            .addInterceptor()
//            .addNetworkInterceptor()
            .build() //构建者模式
        //2.创建Request对象
        val request = Request.Builder()
            .get()
            .url("https://www.baidu.com")
            .build()
        //3.client发起request===》call
        val newCall = okHttpClient.newCall(request)
        //4：同步==>response
        val response =  newCall.execute()
        println(response.body?.string())
        //5：异步==>response
        newCall.enqueue(object :okhttp3.Callback{
            override fun onFailure(call: Call, e: IOException) {

            }

            override fun onResponse(call: Call, response: Response) {
                //response结果
                val body = response.body
                val string = body?.string()
                println(string)
            }
        })


    }
}